#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>

// 1. 自定义视图类：专门用于绘制笑脸（drawRect:必须放在NSView子类中）
@interface SmileyView : NSView {
    NSImage *smileyImage;  // 存储笑脸图像
}
- (instancetype)initWithFrame:(NSRect)frame;  // 初始化方法
@end

@implementation SmileyView

- (instancetype)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // 初始化笑脸图像（直接在视图内生成，无需外部图片）
        smileyImage = [[NSImage alloc] initWithSize:frame.size];
        [smileyImage lockFocus];  // 锁定图像上下文，开始绘制
        
        // 步骤1：绘制黄色圆形头部
        [[NSColor yellowColor] set];  // 设置填充色为黄色
        NSBezierPath *facePath = [NSBezierPath bezierPathWithOvalInRect:NSMakeRect(0, 0, frame.size.width, frame.size.height)];
        [facePath fill];  // 填充圆形
        
        // 步骤2：绘制黑色圆形眼睛（位置和大小按比例计算，适配不同视图尺寸）
        CGFloat eyeSize = frame.size.width * 0.15;  // 眼睛大小 = 头部宽度的15%
        CGFloat eyeX1 = frame.size.width * 0.25;    // 左眼X坐标 = 头部宽度的25%
        CGFloat eyeX2 = frame.size.width * 0.6;     // 右眼X坐标 = 头部宽度的60%
        CGFloat eyeY = frame.size.height * 0.25;    // 眼睛Y坐标 = 头部高度的25%
        
        [[NSColor blackColor] set];  // 设置填充色为黑色
        // 绘制左眼
        NSBezierPath *leftEye = [NSBezierPath bezierPathWithOvalInRect:NSMakeRect(eyeX1, eyeY, eyeSize, eyeSize)];
        [leftEye fill];
        // 绘制右眼
        NSBezierPath *rightEye = [NSBezierPath bezierPathWithOvalInRect:NSMakeRect(eyeX2, eyeY, eyeSize, eyeSize)];
        [rightEye fill];
        
        // 步骤3：绘制微笑弧线
        CGFloat smileRadius = frame.size.width * 0.3;  // 微笑圆弧半径 = 头部宽度的30%
        NSPoint smileCenter = NSMakePoint(
            frame.size.width * 0.5,    // 圆弧中心点X = 头部宽度的50%（居中）
            frame.size.height * 0.45   // 圆弧中心点Y = 头部高度的45%（偏下）
        );
        
        NSBezierPath *smilePath = [NSBezierPath bezierPath];
        // 绘制圆弧：起始角度0.2π（轻微向右下），结束角度0.8π（轻微向右上），形成微笑
        [smilePath appendBezierPathWithArcWithCenter:smileCenter
                                              radius:smileRadius
                                          startAngle:0.2 * M_PI
                                            endAngle:0.8 * M_PI];
        [smilePath setLineWidth:frame.size.width * 0.03];  // 线条宽度 = 头部宽度的3%
        [smilePath stroke];  // 描边绘制（不填充，仅显示线条）
        
        [smileyImage unlockFocus];  // 解锁图像上下文，结束绘制
    }
    return self;
}

// 2. 重写drawRect:方法（NSView子类专属）：绘制笑脸图像
- (void)drawRect:(NSRect)rect {
    [super drawRect:rect];  // 调用父类方法，确保基础绘制正常
    // 将笑脸图像绘制到当前视图的可见区域
    [smileyImage drawInRect:rect
                fromRect:NSZeroRect  // 从图像的完整区域读取
               operation:NSCompositeSourceOver  // 正常混合模式（覆盖背景）
                 fraction:1.0];  // 完全不透明
}

// 释放资源，避免内存泄漏
- (void)dealloc {
    [smileyImage release];
    [super dealloc];
}

@end

// 3. 应用代理类：负责窗口和移动逻辑（与之前一致）
@interface PetDelegate : NSObject <NSApplicationDelegate> {
    NSWindow *petWindow;
    NSTimer *moveTimer;
    int directionX;
    int directionY;
}
- (void)movePet:(NSTimer *)timer;
- (void)changeDirection;
- (void)petClicked:(id)sender;
@end

@implementation PetDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)notification {
    // 获取屏幕尺寸，计算窗口初始位置（居中显示）
    NSRect screenFrame = [[NSScreen mainScreen] frame];
    CGFloat petSize = 80;  // 宠物窗口尺寸（80x80像素，比之前稍大，更清晰）
    NSRect windowFrame = NSMakeRect(
        (screenFrame.size.width - petSize) / 2,  // X轴居中
        (screenFrame.size.height - petSize) / 2, // Y轴居中
        petSize, petSize
    );
    
    // 创建无边框、透明、置顶的宠物窗口
    petWindow = [[NSWindow alloc] initWithContentRect:windowFrame
                                           styleMask:NSWindowStyleMaskBorderless
                                             backing:NSBackingStoreBuffered
                                               defer:NO];
    [petWindow setBackgroundColor:[NSColor clearColor]];  // 背景透明
    [petWindow setOpaque:NO];                             // 禁用不透明（允许透明效果）
    [petWindow setLevel:NSFloatingWindowLevel];           // 窗口置顶
    [petWindow setHasShadow:YES];                         // 启用阴影（增强立体感）
    [petWindow setTitle:@"Smiley Pet"];
    
    // 4. 关键修复：使用自定义SmileyView作为窗口内容视图（而非默认NSView）
    SmileyView *smileyView = [[SmileyView alloc] initWithFrame:NSMakeRect(0, 0, petSize, petSize)];
    [petWindow setContentView:smileyView];  // 将笑脸视图绑定到窗口
    [smileyView release];  // 释放视图所有权（窗口已持有）
    
    // 初始化移动方向和定时器
    directionX = 1;
    directionY = 1;
    [self changeDirection];
    
    moveTimer = [NSTimer scheduledTimerWithTimeInterval:0.05
                                                target:self
                                              selector:@selector(movePet:)
                                              userInfo:nil
                                               repeats:YES];
    
    [petWindow makeKeyAndOrderFront:nil];  // 显示窗口
}

// 鼠标点击事件（点击笑脸时触发）
- (void)mouseDown:(NSEvent *)theEvent {
    [self petClicked:self];
}

// 点击后的提示框
- (void)petClicked:(id)sender {
    NSAlert *alert = [[NSAlert alloc] init];
    [alert setMessageText:@"Hello!"];
    [alert setInformativeText:@"I'm your desktop smiley pet!"];
    [alert addButtonWithTitle:@"Touch Head"];
    [alert runModal];
    [alert release];
}

// 宠物移动逻辑
- (void)movePet:(NSTimer *)timer {
    NSRect currentFrame = [petWindow frame];
    NSRect screenFrame = [[NSScreen mainScreen] frame];
    
    // 更新位置
    currentFrame.origin.x += directionX;
    currentFrame.origin.y += directionY;
    
    // 边界检测（碰到边缘反向）
    if (currentFrame.origin.x < 0 || currentFrame.origin.x + currentFrame.size.width > screenFrame.size.width) {
        directionX = -directionX;
    }
    if (currentFrame.origin.y < 0 || currentFrame.origin.y + currentFrame.size.height > screenFrame.size.height) {
        directionY = -directionY;
    }
    
    [petWindow setFrame:currentFrame display:YES];
}

// 随机改变移动方向和速度
- (void)changeDirection {
    directionX = (arc4random_uniform(3) + 1) * (arc4random_uniform(2) ? 1 : -1);
    directionY = (arc4random_uniform(3) + 1) * (arc4random_uniform(2) ? 1 : -1);
    
    [NSTimer scheduledTimerWithTimeInterval:(arc4random_uniform(2) + 3)
                                     target:self
                                   selector:@selector(changeDirection)
                                   userInfo:nil
                                    repeats:NO];
}

// 释放资源
- (void)dealloc {
    [moveTimer invalidate];
    [petWindow release];
    [super dealloc];
}

@end

// 主函数：应用入口
int main(int argc, const char **argv) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
    [NSApplication load];
    NSApplication *app = [NSApplication sharedApplication];
    
    // 设置语言为英文（避免乱码）
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[NSArray arrayWithObjects:@"en", nil] forKey:@"AppleLanguages"];
    
    PetDelegate *delegate = [[PetDelegate alloc] init];
    [app setDelegate:delegate];
    
    [app run];
    
    [delegate release];
    [pool release];
    return 0;
}
